package main

import (
	"fmt"
	"time"
)

//自己写一个超时时间
func TimeoutTest1()  {
	//1、先设置一个循环插入channel的程序，程序中每次插入都要等待1s
	ch := make(chan int, 10)
	go func() {
		for i := 0; i < 10; i++ {
			ch <- i
			time.Sleep(time.Duration(1 * time.Second))
		}
	}()

	//2、设置一个timeout，2s后插入
	timeout := make(chan bool)
	go func() {
		time.Sleep(time.Duration(2 * time.Second))//相当于设置了超时时间
		timeout <- true
	}()

	for {
		select {
		case num := <-ch:
			fmt.Println("未超时前接收到的数据：num=", num)
		case isTimeout := <-timeout: //一旦超时，则进入此分支，并且退出for循环
			fmt.Println("超时啦：isTimeout=", isTimeout)
			return
		}
	}
}

//运用time.After设置超时时间
func TimeoutTest2()  {
	ch1 := make(chan string)

	// 激活一个goroutine，但5秒之后才发送数据
	go func() {
		time.Sleep(5 * time.Second)
		ch1 <- "put value into ch1"
	}()

	select {
	case val := <-ch1:
		fmt.Println("recv value from ch1:",val)
		return
	// 只等待3秒，然后就结束，此处肯定是比5s快的
	case <-time.After(3 * time.Second):
		fmt.Println("3 second over, timeout")
	}
}


func main() {
	TimeoutTest1()
}
